eXo Groovy Console
Description:
eXo Groovy Console allows you to run Groovy code interactively. It accepts eXo API and can access eXo components deployed in portal container so this can be used as a tool for drafting code, tesing or exploring eXo API/components/data interactively on a live system.
In a session, variables and import statements are saved automatically as session context for user to reference later if needed. Currently class and function definitions are not saved (due to the difficulty of parsing them from a script), however we can send them along with other statements to the console once at a time (as a single command in the console via copy/paste, or as a script)
Available session management commands:
show imports Show imported packages
show variables Show defined variables
list sessions [<regex pattern>] List all saved sessions which's name matches <regex pattern>
clear session Clear the session
save session as <session name> Save session
load session <session name> Load session
remove session <session name> Remove session
remove all sessions [<regex pattern>] Remove all session which's name matches <regex pattern>
The console's GUI:
We use the JQuery Terminal Emulator plugin for the console's GUI. Below are some useful shotcuts and commands for working with the console (please refer to the plugin's website for more information):
Shotcut keys:
Up/Down Command history
PgUp/PgDn Scroll up/down
Ctrl-C/Ctrl-V Copy/Paste
Ctrl-K Remove the text after the cursor
ESC Clear command line
Console commands:
clear Clear console screen
edit Show extent editor
pause Disable terminal
run Execute content in extent input
Sample sessions:
1. Test importing:
groovy> println PI
ERROR: Error executing script: No such property: PI for class: Script1
groovy> import static java.lang.Math.*
groovy> println PI
3.141592653589793
groovy> println sin(PI/2)
1.0
groovy>
2. Test running eXo API and session management commands:
Run the following script line-by-line
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.Repository;
import javax.jcr.Session;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.StandaloneContainer;
import org.exoplatform.services.jcr.RepositoryService;
RepositoryService repositoryService = (RepositoryService)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(RepositoryService.class);
Repository repository = repositoryService.getDefaultRepository();
Session session = repository.login();
Node rootNode = session.getRootNode();
println rootNode
rootNode.getNodes().each{println it.name}
The session:groovy> import javax.jcr.Node;
groovy> import javax.jcr.Property;
groovy> import javax.jcr.Repository;
groovy> import javax.jcr.Session;
groovy> import org.exoplatform.container.ExoContainerContext;
groovy> import org.exoplatform.container.StandaloneContainer;
groovy> import org.exoplatform.services.jcr.RepositoryService;
groovy>
groovy> show imports
[GroovySession@2011.5.16_7h53m4s]
import org.exoplatform.services.jcr.RepositoryService;
import javax.jcr.Node;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.StandaloneContainer;
import javax.jcr.Repository;
import javax.jcr.Session;
import javax.jcr.Property;
groovy> RepositoryService repositoryService = (RepositoryService)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(RepositoryService.class);
groovy> Repository repository = repositoryService.getDefaultRepository();
groovy> Session session = repository.login();
groovy> Node rootNode = session.getRootNode();
groovy>
groovy> show variables
[GroovySession@2011.5.16_7h53m4s]
repositoryService = (RepositoryService)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(RepositoryService.class);
repository = repositoryService.getDefaultRepository();
session = repository.login();
rootNode = session.getRootNode();
groovy>
groovy> println rootNode
org.exoplatform.services.jcr.impl.core.NodeImpl@145f173
groovy>
groovy> rootNode.getNodes().each{println it.name}
exo:registry
exo:applications
exo:services
Users
Groups
Digital Assets
Documents
Trash
Records Space
Application Data
tags
sites content
xcmis:system
exo:loginHistoryHome
exo:groovyConsoleService
groovy>
groovy> save session as JcrTest
Session was saved successfully to 'JcrTest'
groovy>
groovy> clear session
Session cleared.
groovy>
groovy> show imports
[GroovySession@2011.5.16_7h53m4s]
<empty>
groovy> show variables
[GroovySession@2011.5.16_7h53m4s]
<empty>
groovy> load session JcrTest
Session 'JcrTest' was loaded successfully.
groovy>
groovy> show imports
[GroovySession@2011.5.16_7h53m4s]
import org.exoplatform.services.jcr.RepositoryService;
import javax.jcr.Node;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.StandaloneContainer;
import javax.jcr.Repository;
import javax.jcr.Session;
import javax.jcr.Property;
groovy> show variables
[GroovySession@2011.5.16_7h53m4s]
repositoryService = (RepositoryService)ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(RepositoryService.class);
repository = repositoryService.getDefaultRepository();
session = repository.login();
rootNode = session.getRootNode();
groovy> println rootNode
org.exoplatform.services.jcr.impl.core.NodeImpl@1d29612
groovy>
3. Test running function and class definition via copy/paste
Copy and paste the following script to the console (use Ctrl-V to paste)
class myClass {
String hello() {
return "Hello from class"
}
}
myFunc()
cls = new myClass()
println cls.hello()
The session:
groovy> void myFunc() {
println "Hello from function"
}
class myClass {
String hello() {
return "Hello from class"
}
}
myFunc()
cls = new myClass()
println cls.hello()
Hello from function
Hello from class
groovy>